package core

//go get github.com/mattn/go-sqlite3
import (
	"database/sql"
	"os"
	"sync"

	_ "github.com/mattn/go-sqlite3" // 匿名导入以注册驱动
)

type Sqlite3 struct {
	DBName string
	DB     *sql.DB
}

var (
	instance2 *Sqlite3
	once2     sync.Once
)

func GetSqlite3() *Sqlite3 {
	once2.Do(func() {
		// 数据总线，用于应用间通信
		instance2 = NewSqlite3()
	})
	return instance2
}

// 返回true表示文件或文件夹存在
func FileOrPathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil // 文件存在
	}
	if os.IsNotExist(err) {
		return false, nil // 文件不存在
	}
	return false, err // 其他错误
}
func NewSqlite3() *Sqlite3 {
	return &Sqlite3{DBName: "", DB: nil}
}

// ./my.db
// 返回true表示打开已存在数据库，反之为新建数据库
func (s *Sqlite3) OpenSqlite3(dbname string) (bool, error) {
	exist, _ := FileOrPathExists(dbname)
	s.DBName = dbname
	db, err := sql.Open("sqlite3", s.DBName)
	if err != nil {
		s.DB = nil
		return exist, err
	}
	s.DB = db
	return exist, nil
}
func (s *Sqlite3) CloseDB() error {
	return s.DB.Close()
}
func (s *Sqlite3) QuerySQL(sql string) (*sql.Rows, error) {
	return s.DB.Query(sql)
}
func (s *Sqlite3) ExecSQL(sql string) (sql.Result, error) {
	return s.DB.Exec(sql)
}
func (s *Sqlite3) PrepareSQL(sql string) (*sql.Stmt, error) {
	return s.DB.Prepare(sql)
}
func (s *Sqlite3) CloseRows(rows *sql.Rows) error {
	return rows.Close()
}
func (s *Sqlite3) CloseStmt(stmt *sql.Stmt) error {
	return stmt.Close()
}
